/**
 * 这段代码配置了一个 axios 实例，并设置了请求和响应的拦截器。请求拦截器在请求发送前添加认
 * 证 token 和处理请求数据的格式。响应拦截器处理服务器返回的数据，检查状态码以决定是否需要重
 * 新登录或处理错误。所有的网络请求都通过这个配置的 http 实例进行，从而确保了统一的请求和错误处理
 */

'use strict'

import axios from 'axios' //引入 axios 库，用于发送 HTTP 请求
import { clearToken, getToken } from './cookie' //引入用于处理 token 的工具函数 clearToken 和 getToken，这些函数通常用于获取和清除浏览器中的认证 token
import { MessageBox, Message } from 'element-ui'
import panUtil from './common' //引入工具函数模块 panUtil，通常用于提供一些常用的辅助函数，如获取 URL 前缀
import store from '../store'

const toLogin = function () {
        // to re-login
        MessageBox.confirm('您需要重新登陆', '确认退出登录', { //确认对话框,显示确认对话框
            confirmButtonText: '重新登陆',
            cancelButtonText: '取消',
            type: 'warning'
        }).then(() => {
            clearToken() //调用 clearToken 函数清除浏览器中的 token
            store.commit('file/clear') //清除 Vuex store 中的相关模块状态，通常用于重置用户的状态
            store.commit('breadcrumb/clear')
            store.commit('navbar/clear')
            store.commit('user/clear')
            window.location.reload() //重新加载页面，以确保用户被重定向到登录页面
        })
    },
    http = axios.create({ //创建一个新的 axios 实例，并进行配置
        baseURL: panUtil.getUrlPrefix(), //设置基础 URL。panUtil.getUrlPrefix() 函数返回一个基础 URL，用于构建所有请求的完整 URL
        timeout: 1000 * 60, //设置请求超时时间为 60 秒
        headers: {
            'Content-Type': 'application/json;charset=utf-8' //设置默认的请求头格式
        }
    })

http.interceptors.request.use(config => { //配置请求拦截器
    if (config.data) {
        config.data = JSON.stringify(config.data)  //如果请求包含数据，将其转换为 JSON 字符串，某些情况下请求数据需要以 JSON 格式发送
    }
    let token = getToken() //获取认证 token
    if (token) {
        config.headers['Authorization'] = token //如果 token 存在，将其添加到请求头的 Authorization 字段中，以进行身份验证
    }
    return config
}, error => {
    Message.error('请求失败')
    return
})

http.interceptors.response.use(res => {  //配置响应拦截器
    if (res.data.status === 10) {
        toLogin()  //如果响应数据的状态码是 10（通常代表认证失败或需要重新登录），调用 toLogin() 函数提示用户重新登录，并返回一个被拒绝的 Promise
        res.data.message = '您需要重新登陆'
        return Promise.reject(res.data)
    }
    if (res.data.status !== 0) { //如果响应数据的状态码不是 0（通常代表成功），返回一个被拒绝的 Promise，并将响应数据作为拒绝理由
        return Promise.reject(res.data)
    }
    return res.data //如果状态码为 0，表示请求成功，返回响应数据
}, error => {
    Message.error('请求失败')
    return
})

export default http
